home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swags_z.zip / SCREEN.SWG / 0069_Char At 80.pas < prev    next >
Pascal/Delphi Source File  |  1994-08-24  |  2KB  |  111 lines

  1. {
  2.  SG> Anybody know how to place a character at 80,25 in text mode without
  3.  SG> scrolling the screen?  TIA
  4. }
  5.  
  6. USES Crt;
  7.  
  8. var
  9.   ScreenHeight : byte;   { screen height in characters (rows) }
  10.   ScreenWidth : word;    { screen width in characters (columns) }
  11.   Screen : pointer;      { screen pointer }
  12.  
  13. { some usef00l routines }
  14.  
  15. Function ScrReadChar(X,Y : BYTE) : CHAR; assembler;
  16. Asm
  17.   LES DI,Screen
  18.   XOR AH,AH
  19.   MOV AL,Y
  20.   DEC AX
  21.   MUL ScreenWidth
  22.   SHL AX,1
  23.   XOR DH,DH
  24.   MOV DL,X
  25.   SHL DX,1
  26.   DEC DX
  27.   DEC DX
  28.   ADD AX,DX
  29.   MOV DI,AX
  30.   MOV AL,BYTE PTR [ES:DI]
  31.   {ScrReadChar := Char(Ptr(Seg(Screen^),
  32.     (Y - 1) * ScreenWidth * 2 + (X * 2) - 2)^)}
  33. End; { ScrReadChar }
  34.  
  35. Procedure ScrWriteChar(X,Y : BYTE; Ch : CHAR); assembler;
  36. Asm
  37.   LES DI,Screen
  38.   XOR AH,AH
  39.   MOV AL,Y
  40.   DEC AX
  41.   MUL ScreenWidth
  42.   SHL AX,1
  43.   XOR DH,DH
  44.   MOV DL,X
  45.   SHL DX,1
  46.   DEC DX
  47.   DEC DX
  48.   ADD AX,DX
  49.   MOV DI,AX
  50.   MOV AL,Ch
  51.   MOV BYTE PTR [ES:DI],AL
  52.   {Char(Ptr(Seg(Screen^),
  53.     (Y - 1) * ScreenWidth * 2 + (X * 2) - 2)^) := Ch}
  54. End; { ScrWriteChar }
  55.  
  56. Function ScrReadAttr(X,Y : BYTE) : BYTE; assembler;
  57. Asm
  58.   LES DI,Screen
  59.   XOR AH,AH
  60.   MOV AL,Y
  61.   DEC AX
  62.   MUL ScreenWidth
  63.   SHL AX,1
  64.   XOR DH,DH
  65.   MOV DL,X
  66.   SHL DX,1
  67.   DEC DX
  68.   ADD AX,DX
  69.   MOV DI,AX
  70.   MOV AL,BYTE PTR [ES:DI]
  71.   {ScrReadAttr := TTextAttr(Ptr(Seg(Screen^),
  72.     (Y - 1) * ScreenWidth * 2 + (X * 2) - 1)^)}
  73. End; { ScrReadAttr }
  74.  
  75. Procedure ScrWriteAttr(X,Y,Color : BYTE); assembler;
  76. Asm
  77.   LES DI,Screen
  78.   XOR AH,AH
  79.   MOV AL,Y
  80.   DEC AX
  81.   MUL ScreenWidth
  82.   SHL AX,1
  83.   XOR DH,DH
  84.   MOV DL,X
  85.   SHL DX,1
  86.   DEC DX
  87.   ADD AX,DX
  88.   MOV DI,AX
  89.   MOV AL,Color
  90.   MOV BYTE PTR [ES:DI],AL
  91.   {TTextAttr(Ptr(Seg(Screen^),
  92.     (Y - 1) * ScreenWidth * 2 + (X * 2) - 1)^) := Color}
  93. End; { ScrWriteAttr }
  94.  
  95. { and finally in your program... }
  96.  
  97. Begin
  98.   { initialize ScreenHeight, ScreenWidth and Screen... }
  99.   if LastMode = Mono then
  100.     Screen := Ptr($B000, 0) else Screen := Ptr($B800, 0);
  101.   if (LastMode and Font8x8) <> 0 then
  102.     ScreenHeight := Mem[$0040:$0084] else ScreenHeight := 25;
  103.   ScreenWidth := MemW[$0040:$004A];
  104.  
  105.   { do whatever you want, for example: }
  106.     ScrWriteChar(ScreenWidth, ScreenHeight, 'A');
  107.     ScrWriteAttr(ScreenWidth, ScreenHeight, LightGray );
  108.  
  109. End.
  110.  
  111.